<script>
    //深拷贝:就是将对象中的引用数据类型,全部将值进行拷贝,实现的方式就是通过递归

    //构造函数创建一个对象

    //new一个构造函数发生了什么?
    //1.this指向当前的实例
    //2.实例的constructor指向构造函数
    //3.开辟一个内存空间
    //4.执行构造函数中的代码


    function Person(name, age) {
        this.name = name;
        this.age = age;
        this.hobby = ['唱', '跳', 'rap']
        this.girlFriend = {
            nickname: '乔碧萝',
            arr: ['吃', '写代码', '榜一大哥', [1, 2, 3, 4, 6, { skill: '飞' }]]
        }
    }

    let p1 = new Person('李雷', 20);// {name: "李雷",hobby:['唱', '跳', 'rap'], age: 20, girlFriend: {…}}

    // console.log(p1);
    //采用递归的方式,对对象进行深拷贝
    //需求:拷贝p1
    //data就是要进行拷贝的对象
    function deepCopy(data) {
        let newObj = {};//声明一个对象用于拷贝原来的对象属性
        let arr = [];//用于拷贝数组
        //进行一个判断,判断data是不是一个引用数据类型
        //要区分是数组还是对象
        if (typeof data === 'object' && !Array.isArray(data)) {
            for (k in data) {
                //判断 如果某个属性值是引用数据类型
                if (typeof data[k] === "object") {
                    newObj[k] = deepCopy(data[k])
                } else {
                    newObj[k] = data[k]
                }
            }
            return newObj
        } else if (Array.isArray(data)) {
            //    data= ['唱', '跳', 'rap']
            for (let i = 0; i < data.length; i++) {
                //拷贝多维数组
                if (typeof data[i] === 'object') {
                    arr.push(deepCopy(data[i]))
                } else {
                    arr.push(data[i])
                }
            }
            return arr
        }

    }

    let p2 = deepCopy(p1)
    p2.name = '小明'
    p2.girlFriend.nickname = '55开'
    p2.girlFriend.arr.push("999")
    p2.girlFriend.arr[3].push('888')
    p2.girlFriend.arr[3][5].bodyFriend = '建军'
    console.log("p1==========", p1);
    console.log("p2==========", p2);


    // let arr = [1, 2, 3, 4, 5]
    // for (k in arr) { 
    //     console.log(k);
    //     console.log(arr[k]);
    // }
</script>